#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
#define N 5
void RunChild()
{
    int cnt = 5;
    while(cnt)
    {
        printf("I am Child Process, pid: %d, ppid:%d\n", getpid(), getppid());
        sleep(1);
        cnt--;
    }
}//<iPaste>
int main()
{

  //pid_t id=fork();
  //if(id==0)
  //{
  //  //子进程
  //  int cut=5;
  //  while(cut)
  //  {
  //    printf("I am child :%d: %d: cut=%d\n",getpid(),getppid(),cut--);
  //    sleep(1);
  //  }
  //  //sleep(1);
  //  exit(1);
  //}
  //else if(id>0)
  //{
  //  int cnt = 5;
  //  while(cnt)
  //  {
  //    printf("I am father, pid:%d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
  //    cnt--;
  //    sleep(1);
  //  }
  //  //父进程在等待子进程
  //  //父进程
  //  //printf("T am father:%d: %d: \n",getpid(),getppid());
  //  
  //
  //}
 // 
 // //pid_t id=fork();
 // for(int i=0;i<N;i++)
 // {
 //   pid_t Id=fork();
 //   if(Id==0)
 //   {
 //     RunChild();
 //     exit(11);
 //   }
//
 // }
 

  typedef void (*hashptr)();
  vector<hashptr> hashpptr;
  pid_t id=fork();
  if(id==0)
  {
    int cnt = 10;
    while(cnt)
    {
        printf("I am child, pid:%d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
        cnt--;
        sleep(1);
        //*p = 100;
    }
    exit(11);
  }
  else if(id>0)
  {
    // parent
   int cnt = 5;
   while(cnt)
   {
     printf("I am father, pid:%d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
     cnt--;
     sleep(1);
   }
   // 目前为止，进程等待是必须的！
   // wait是等待任意一个子进程退出
   
   int status=0;
   //pid_t ret=waitpid(id,&status,0);
   while(1)
   {
      pid_t ret=waitpid(id,&status,0);
      if(ret>0)
      {
        if(WIFEXITED(status))
          printf("子进程结束,退出码%d:\n",WEXITSTATUS(status));
        else 
        {
          printf("进程异常退出\n");
        }
        break;
      }
      else if(ret==0)
      {
        printf("子进程还在跑，父进程继续等待\n");
       // if(hashptr.empty())
       // {
//
       // }
        sleep(1);
      }
      else 
      {
        printf("进程异常\n");
        break;
      }
   }
}
return 0;
}
